//package cn.xxy;
//
//import cn.xxy.beans.DataSourceConfig;
//import org.apache.commons.dbutils.OutParameter;
//import org.apache.commons.dbutils.QueryRunner;
//import org.apache.commons.dbutils.ResultSetHandler;
//import org.apache.commons.dbutils.handlers.*;
//import cn.xxy.exception.DataAccessException;
//import cn.xxy.exception.ExecuteParamsException;
//import cn.xxy.result.ColumnHandler;
//
//import javax.sql.DataSource;
//import java.sql.*;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//public class CommDbHelper extends DbHelper {
//	private final QueryRunner qr;
//
//	public CommDbHelper(DataSourceConfig dsc) {
//		super(dsc);
//		this.qr = new QueryRunner();
//	}
//
//	public CommDbHelper(String dbName) {
//		super(dbName);
//		this.qr = new QueryRunner();
//	}
//
//	/**
//	 * 查询单个对象
//	 *
//	 * @param conn   数据库连接
//	 * @param sql    sql 语句
//	 * @param params sql 参数
//	 */
//	@Override
//	public <T> T queryObject(Connection conn, String sql, Object... params) throws SQLException {
//		try {
//			return qr.query(conn, sql, new ScalarHandler<T>(), params);
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//	/**
//	 * 查询第一行数据并封装为实体类返回
//	 *
//	 * @param conn   数据库连接
//	 * @param sql    sql 语句
//	 * @param clazz  实体类型
//	 * @param params sql 参数
//	 */
//	@Override
//	public <T> T queryBean(Connection conn, String sql, Class<T> clazz, Object... params) throws SQLException {
//		try {
//			return qr.query(conn, sql, new cn.xxy.result.BeanHandler<T>(clazz), params);
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//	/**
//	 * 查询第一行数据并封装为 <code>Object[]</code> 返回
//	 *
//	 * @param conn   数据库连接
//	 * @param sql    sql 语句
//	 * @param params sql 参数
//	 * @return 无数据时返回空数组（<code>new Object[0]</code>）
//	 */
//	@Override
//	public Object[] queryRowArray(Connection conn, String sql, Object... params) throws SQLException {
//		try {
//			Object[] result = qr.query(conn, sql, new ArrayHandler(), params);
//			return result == null ? new Object[0] : result;
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//
//	/**
//	 * 查询第一行数据并封装为 <code>Map&lt;String, Object&gt;</code> 返回
//	 *
//	 * @param conn   数据库连接
//	 * @param sql    sql 语句
//	 * @param params sql 参数
//	 * @return 无数据时返回空Map（<code>new HashMap&lt;&gt;()</code>）
//	 */
//	@Override
//	public Map<String, Object> queryRowMap(Connection conn, String sql, Object... params) throws SQLException {
//		try {
//			Map<String, Object> result = qr.query(conn, sql, new MapHandler(), params);
//			return result == null ? new HashMap<String, Object>() : result;
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//	/**
//	 * 查询第一列数据
//	 *
//	 * @param conn   数据库连接
//	 * @param sql    sql 语句
//	 * @param params sql 参数
//	 * @return
//	 * @throws SQLException
//	 */
//	@Override
//	public <T> List<T> queryColList(Connection conn, String sql, Object... params) throws SQLException {
//		try {
//			return qr.query(conn, sql, new cn.xxy.result.ColumnListHandler<T>(), params);
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//	/**
//	 * 查询数据并封装为 <code>List&lt;Map&lt;String, Object&gt;&gt;</code> 返回
//	 *
//	 * @param conn   数据库连接
//	 * @param sql    sql 语句
//	 * @param params sql 参数
//	 */
//	@Override
//	public List<Map<String, Object>> queryListMap(Connection conn, String sql, Object... params) throws SQLException {
//		return qr.query(conn, sql, new MapListHandler(), params);
//	}
//
//	/**
//	 * 查询数据并封装为 <code>List&lt;Object[]&gt;</code> 返回
//	 *
//	 * @param conn   数据库连接
//	 * @param sql    sql 语句
//	 * @param params sql 参数
//	 */
//	@Override
//	public List<Object[]> queryListArray(Connection conn, String sql, Object... params) throws SQLException {
//		try {
//			return qr.query(conn, sql, new ArrayListHandler(), params);
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//	/**
//	 * 查询数据并封装为 <code>List&lt;T&gt;</code> 返回
//	 *
//	 * @param conn   数据库连接
//	 * @param sql    sql 语句
//	 * @param clazz  实体类型
//	 * @param params sql 参数
//	 */
//	@Override
//	public <T> List<T> queryListBean(Connection conn, String sql, Class<T> clazz, Object... params) throws SQLException {
//		try {
//			return qr.query(conn, sql, new cn.xxy.result.BeanListHandler<T>(clazz), params);
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//	/**
//	 * 查询数据并封装为 <code>Map&lt;K, Map&lt;String, Object&gt;&gt;</code> 返回
//	 *
//	 * @param conn     数据库连接
//	 * @param sql      sql 语句
//	 * @param keyedCol 键列列名
//	 * @param params   sql 参数
//	 * @return 无数据时返回空Map（<code>new HashMap&lt;&gt;()</code>）
//	 */
//	@Override
//	public <K> Map<K, Map<String, Object>> queryKeyedMap(Connection conn, String sql, String keyedCol, Object... params) throws SQLException {
//		try {
//			Map<K, Map<String, Object>> result = qr.query(conn, sql, new KeyedHandler<K>(keyedCol), params);
//			return result == null ? new HashMap<K, Map<String, Object>>() : result;
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//	/**
//	 * 查询数据并封装为 <code>Map&lt;K, B&gt;</code> 返回
//	 *
//	 * @param conn     数据库连接
//	 * @param sql      sql 语句
//	 * @param clazz    实体类型
//	 * @param keyedCol 键列列名
//	 * @param params   sql 参数
//	 * @return 无数据时返回空Map（<code>new HashMap&lt;&gt;()</code>）
//	 */
//	@Override
//	public <K, B> Map<K, B> queryKeyedBean(Connection conn, String sql, Class<B> clazz, String keyedCol, Object... params) throws SQLException {
//		try {
//			Map<K, B> result = qr.query(conn, sql, new cn.xxy.result.BeanMapHandler<K, B>(clazz, keyedCol), params);
//			return result == null ? new HashMap<K, B>() : result;
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//	/**
//	 * Execute an SQL SELECT query with replacement parameters.  The
//	 * caller is responsible for closing the connection.
//	 * @param <T> The type of object that the handler returns
//	 * @param conn The connection to execute the query in.
//	 * @param sql The query to execute.
//	 * @param rsh The handler that converts the results into an object.
//	 * @param params The replacement parameters.
//	 * @return The object returned by the handler.
//	 * @throws SQLException if a database access error occurs
//	 */
//	@Override
//	public <T> T query(final Connection conn, final String sql, final ResultSetHandler<T> rsh, final Object... params) throws SQLException {
//		try {
//			return qr.query(conn, sql, rsh, params);
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//	/**
//	 * 执行Sql语句
//	 *
//	 * @param conn   数据库连接
//	 * @param sql    sql 语句
//	 * @param params sql 参数
//	 * @return 修改的行数
//	 */
//	@Override
//	public int executeUpdate(Connection conn, String sql, Object... params) throws SQLException {
//		try {
//			return qr.update(conn, sql, params);
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//
//	/**
//	 * 批量操作
//	 *
//	 * @param sql    sql语句
//	 * @param params 批量参数
//	 * @return 影响行数
//	 */
//	@Override
//	public int[] executeBath(final String sql, final Object[][] params) throws SQLException {
//		Connection connection = beginTransaction();
//		if (connection == null) {
//			throw new ExecuteParamsException("Null connection.");
//		}
//		if (sql == null || sql.isEmpty()) {
//			closeConns(connection);
//			throw new ExecuteParamsException("Null SQL statement.");
//		}
//		try {
//			int[] rets = qr.batch(connection, sql, params);
//			commitConns(connection);
//			return rets;
//		} catch (SQLException e) {
//			rollbackConns(connection);
//			throw new DataAccessException(e);
//		} finally {
//			closeConns(connection);
//		}
//	}
//
//	/**
//	 * Execute an SQL statement, including a stored procedure call, which does
//	 * not return any result sets.
//	 * Any parameters which are instances of {@link OutParameter} will be
//	 * registered as OUT parameters.
//	 * <p>
//	 * Use this method when invoking a stored procedure with OUT parameters
//	 * that does not return any result sets.  If you are not invoking a stored
//	 * procedure, or the stored procedure has no OUT parameters, consider using
//	 * {@link #executeUpdate(java.sql.Connection, String, Object...) }.
//	 * If the stored procedure returns result sets, use
//	 * {@link #execute(java.sql.Connection, String, org.apache.commons.dbutils.ResultSetHandler, Object...) }.
//	 *
//	 * @param conn The connection to use to run the query.
//	 * @param sql The SQL to execute.
//	 * @param params The query replacement parameters.
//	 * @return The number of rows updated.
//	 * @throws SQLException if a database access error occurs
//	 */
//	@Override
//	public int execute(final Connection conn, final String sql, final Object... params) throws SQLException {
//		try {
//			return qr.execute(conn, sql, params);
//		} catch (SQLException e) {
//			throw new DataAccessException(e);
//		} finally {
//			if (conn.getAutoCommit()) {
//				closeConns(conn);
//			}
//		}
//	}
//}
